package com.example.good.service.impl;

import com.example.good.entity.User;
import com.example.good.mapper.UserMapper;
import com.example.good.service.ISMSService;
import com.example.good.service.ex.UpdateException;
import com.example.good.service.ex.UserNotFoundException;
import com.example.good.service.ex.VerificationCodeErrorException;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Random;

@Service
public class SMSServiceImpl implements ISMSService {
    @Autowired
    private UserMapper userMapper;
    private String randomNum;
    @Override
    public SendStatus[] sendSMS(String username, String phone, String templateID) throws TencentCloudSDKException {
        User result = userMapper.findByUsername(username);
        if (result == null){
            throw new UserNotFoundException("用户不存在");
        }
        Credential cred = new Credential("AKIDQfeNqmRpwmLefRxDCvNYS5RWKsABvNZU","g5D5g02oJXUBcmeFaeRxCBuMY1D8mAG5");
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setReqMethod("GET");
        httpProfile.setConnTimeout(60);
        /* 非必要步骤:
         * 实例化一个客户端配置对象，可以指定超时时间等配置 */
        ClientProfile clientProfile = new ClientProfile();
        /* SDK 默认用 TC3-HMAC-SHA256 进行签名
         * 非必要请不要修改该字段 */
        clientProfile.setSignMethod("HmacSHA256");
        clientProfile.setHttpProfile(httpProfile);
        /* 实例化 SMS 的 client 对象
         * 第二个参数是地域信息，可以直接填写字符串 ap-guangzhou，或者引用预设的常量 */
        SmsClient client = new SmsClient(cred, "",clientProfile);
        /* 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
         * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
         * 属性可能是基本类型，也可能引用了另一个数据结构
         * 推荐使用 IDE 进行开发，可以方便地跳转查阅各个接口和数据结构的文档说明 */
        SendSmsRequest req = new SendSmsRequest();

        /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID，例如1400006666 */
        String appid = "1400646155";
        req.setSmsSdkAppid(appid);

        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
        String sign = "海哥个人空间";
        req.setSign(sign);

        /* 国际/港澳台短信 senderid: 国内短信填空，默认未开通，如需开通请联系 [sms helper] */
        String senderid = "";
        req.setSenderId(senderid);

        /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
        String session = "xxx";
        req.setSessionContext(session);

        /* 短信码号扩展号: 默认未开通，如需开通请联系 [sms helper] */
        String extendcode = "";
        req.setExtendCode(extendcode);

        /* 模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID */
//        String templateID = "1332082";
        req.setTemplateID(templateID);

        /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
         * 例如+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
        String[] phoneNumbers = {"+86"+phone};
        req.setPhoneNumberSet(phoneNumbers);
        /* 模板参数: 若无模板参数，则设置为空*/
        Random random = new Random();
        Integer randomI = ((random.nextInt(100000000)*9+1)*1000000);
        randomNum = randomI.toString().substring(1,7);
        String[] templateParams = {randomNum};
        req.setTemplateParamSet(templateParams);

        User user = new User();
        user.setUid(result.getUid());
        user.setTemporaryCode(randomNum);
        user.setModifiedUser(result.getUsername());
        user.setModifiedTime(new Date());
        Integer rows = userMapper.updateInfoByUid(user);
        if (rows != 1){
            throw new UpdateException("更新异常");
        }
        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
         * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
        SendSmsResponse res = client.SendSms(req);

        // 输出 JSON 格式的字符串回包
//        System.out.println(SendSmsResponse.toJsonString(res));
        System.out.println(SendSmsResponse.toJsonString(res));
        SendStatus[] status =  res.getSendStatusSet();
        // 可以取出单个值，您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
//        System.out.println(res.getRequestId());
        return status;
    }

    @Override
    public Integer checkSMS(String username, String phone, String checkNum) {
        User result = userMapper.findByUsername(username);
        if (result == null){
            throw new UserNotFoundException("用户不存在");
        }
        System.out.println(result.getTemporaryCode());
        System.out.println(checkNum);
        if (!checkNum.equals(result.getTemporaryCode())) {
            throw new VerificationCodeErrorException("验证码错误");
        }
        /**如果验证码错误就不会往下执行了*/
        Random random = new Random();
        Integer randomI = ((random.nextInt(100000000)*9+1)*1000000);

        User user = new User();
        user.setUid(result.getUid());
        user.setPhone(phone);
        user.setTemporaryCode(randomI.toString().substring(1,7));
        user.setModifiedUser(result.getUsername());
        user.setModifiedTime(new Date());
        Integer rows = userMapper.updateInfoByUid(user);
        if (rows != 1){
            throw new UpdateException("更新异常");
        }
        return result.getUid();
    }
}
